package java学习.第11章_常用类和基础API;

import java学习.第15章_File类与IO流.C_字符流;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * String的特性
 * ●String类:代表字符串。Java 程序中的所有字符串字面值(如"abc" )都作
 * 为此类的实例实现。
 * ●String是一个final类，代表不可变的字符序列。不可被继承
 * ●字符串是常量，用双引号引起来表示。它们的值在创建之后不能更改。
 * ●String对象的字符内容是存储在- -个零符数组value[]中的。
 * ●String实现了 Serializable     接口:表示字符串是支持序列化的。//IO流在讲
 *        实现了 Comparable(比较器)接口:表示String可以比较大小
 * ●String内部定义了final char[] value  用于存储字符串数据
 * ●String:代表不可变的字符序列。简称:不可变性。
 *  体现: 1.当对字符事重新赋值时，需要重写指定内存区域赋值，不能使用原有的value进行赋值。
 *      2.当对视有的字符事进行连+操作时，也需要里新指定内存区域赋值，不能使用原有内存进行赋值,
 *
 *
 */
public class C_String常用方法 {
    /**
     * 常用方法
     * int length(): 返回字符串的长度: return value.length
     * boolean equals(Object obj):比较字符串的内容是否相同
     * boolean equalsIgnoreCase(String anotherString): equals方法类似， 忽略大小写
     * boolean isEmpty():判断是否是空字符串: return value.length == 0
     * String toLowerCase():使用默认语言环境，将String中的所有字符转换为小写|
     * String toUppTCase():使用默认语言环境，将String 中的所有字符转换为大写
     * String trim():返回字符串的副本，忽略前导空白和尾部空白
     */
    @Test
    public void 常用方法(){
        System.out.println("--------isEmpty()-----------");
        String s1 = "";
        String s11 = null;//null 空不能调用方法
        System.out.println(s1.isEmpty());
//        System.out.println(s11.isEmpty());//报错
        System.out.println("--------length()-----------");
        String s2 = "剃须刀";
        System.out.println(s2.length());//判断长度
        System.out.println("--------equals()和equalsIgnoreCase()-----------");
        String s31= "剃须刀AA";
        String s32= "剃须刀aa";
        System.out.println(s31.equals(s32));//判断是否相等
        System.out.println(s31.equalsIgnoreCase(s32));//无视大小写判断是否相等
        System.out.println("--------compareTo()和compareToIgnoreCase()-----------");
        String s41= "剃须刀AA";
        String s42= "剃须刀aa";//以字符编码顺序比较大小
        System.out.println(s41.compareTo(s42));//比较两者大小
        System.out.println(s41.compareToIgnoreCase(s42));//忽略大小写 比较两者大小
        System.out.println("--------toLowerCase()toUpperCase()-----------");
        String s51= "AbCd";
        System.out.println(s51.toLowerCase(Locale.ROOT));//Locale.ROOT：存在特殊语种需要不同判断
        System.out.println(s51.toLowerCase());//转小写
        System.out.println(s51.toUpperCase());//转大写
        System.out.println("--------trim()-----------");
        String s6 = " 剃 须 刀 \n\r\t";//  \n  \r  \t 等都可忽律
        System.out.println(s6.trim());//去除前后空白字符
    }

    /**
     * 查找
     * String concat(String str):将指定字符串连接到此字符串的结尾。等价 于用“+”
     * int compareTo(String anotherString):比较两个字符串的大小
     * boolean contains(CharSequence S):当且仅当此字符串包含指定的char值序列时，返回true
     * int indexOf(String str):返回指定子字符串在此字符串中第次一出现处的索引
     * int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引，从指定的索引开始
     * int lastIndexOf(String str): 返回指定子字符串在此字符串中最右边出现处的索引  反向搜索
     * int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后
     *      一次出现处的索引，从指定的索引开始反向搜索
     *      注: indexOf和lastIndexOf方法 如果未找到都是返回-1
     * String substring(int beginIndex): 返回一个新的字符串，它是此字符串的从
     *                  beginIndex开始截取到最后的一个子字符串。
     * String substring(int beginIndex, int endIndex) :返回个新字符串， 它是此字
     *                  符串从beginIndex开始截取到endIndex(不包含)的个 子字符串。
     * char charAt(int index):返 回某索引处的字符return value[index]
     * boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束
     * boolean startsWith(String prefix): 测试此字符串是否以指定的前缀开始
     * boolean startsWith(String prefix, int toffset): 测试此字符串从指定索引开始的
     *                  子字符串是否以指定前缀开始
     */
    @Test
    public void 查找(){
        System.out.println("--------contains()-----------");
        String s1 = "123";
        System.out.println(s1.contains("2"));//查找是否包含
        System.out.println("--------indexOf()和lastIndexOf()-----------");
        String s2 = "123";
        //查找次字符串在次字符串第一次出现的位置  从0开始
        System.out.println(s1.indexOf('2'));
        //从指定索引查找
        System.out.println(s1.indexOf('5',6));
        //反向搜索
        System.out.println(s1.lastIndexOf('5',6));
        System.out.println("--------substring()-----------");
        String s3 = "123456789";
        //字符串截取 [5,this.length())
        System.out.println(s3.substring(5));
        System.out.println(s3.substring(5,6));//字符串截取 [5,6)
        System.out.println("--------toCharArray()或charAt()-----------");
        String s4 = "123456789";
        char[] chars = s4.toCharArray();//返回成char数组
        System.out.println(s4.charAt(5));//返回角标为5的字符
        System.out.println("--------startsWith()和endsWith()-----------");
        String s5 = "123456789";
        //此字符串是否以 此字符串开头
        System.out.println(s5.startsWith("1",5));
        System.out.println(s5.endsWith("1"));//此字符串是否以 此字符串当后缀

    }

    /**
     * String替换
     * CharSequence可以用String代替
     * ●String replace(char oldChar, char newChar):返回一个新的字符串，它是
     *                  通过用newChar替换此字符串中出现的所有oldChar得到的。
     * ●String replace(CharSequence target, CharSequence replacement):
     *              使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
     * ●String replaceAll(String regex, String replacement) :使用给定的
     *          replacement  替换此字符串所有匹配给定的正则表达式的子字符串。
     * ●String replaceFirst(String regex, String replacement): 使用给定的
     *          replacement替换此字符串匹配给定的正则表达式的第一一个子字符串。
     */
    @Test
    public void 替换(){
        String s1 = "123qwe字啊实打实";
        System.out.println(s1.replace('1', '2'));
        String str="12hello34word56java789mysql";
        String[] strings= str.split("5");
        System.out.println(strings[0]);
        System.out.println(strings[1]);
        String str1=str.replaceAll("\\d+",",");
        //  \\d数字   +一个或多个前面的
        System.out.println(str1);
    }


    /**
     * String正则
     * ●boolean matches(String regex):
     * 告知此字符串是否匹配给定的正则表达式。
     *
     * String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。
     * String[] split(String regex, int limit):根据匹配给定的正则表达式来拆分此
     * 字符串，最多不超过limit个， 如果超过了，剩下的全部都放到最后一个元素中
     */
    @Test
    public void 正则(){

        String strTest="5+ ${w\\}\\a} + ${wxxx} * ${wxxss}";//[^a]   不存在a字符
        System.out.println(strTest.replaceAll("\\$\\{(([^}\\\\]|\\\\}|\\\\)+)}","$1"));//5+ w\}\a + wxxx * wxxss
        String amt = "+6.12";
        System.out.println("是否是数字:" + amt.matches("[+-]?([1-9][0-9]*|0)([.][0-9]+)?"));
    }
    @Test
    public void test() {
        String s ="@RequestMapping(\"/xxx\")";
        System.out.println(s.replaceAll(".*Mapping[(]\"([a-zA-Z0-9/]*)\"[)]","$1"));//5+ w\}\a + wxxx * wxxss


    }


}
